﻿	org		0x7c00			;指明程序的装载地址
CYLS equ	10		
; FAT12格式软盘专用
	jmp		entry
	db 		0x90

	db 		"EMOSIPL "			;启动区名称(8字节)
	dw		512					;每个扇区(sector)的大小(必须是512字节)
	db 		1					;簇(cluster)的大小(必须是1个扇区)
	dw 		1					;FAT的起始位置(从1开始)
	db 		2					;FAT的个数(必须是2)
	dw 		224					;根目录的大小(一般224项)
	dw 		2880					;磁盘大小(必须是2880扇区)
	db 		0xf0					;磁盘种类
	dw 		9					;FAT的长度(9扇区)
	dw 		18					;一个磁道(track)有几个扇区(必须是18)
	dw 		2					;扇头数
	dd 		0					;不使用分区
	dd 		2880					;重写一次磁盘大小
	db 		0,0,0x29
	dd 		0xffffffff
	db 		"EMOS       "			    ;磁盘名称(11字节)
	db 		"FAT12   "				;磁盘格式名称(8字节)
	resb 	18					;空出18个字节
	
;程序核心
entry:
	mov 	ax,0				;初始化寄存器
	mov 	ss,ax
	mov 	sp,0x7c00
	mov 	ds,ax
	
;读取磁盘
	mov 	ax,0x0820
	mov 	es,ax
	mov 	ch,0				;柱面0
	mov 	dh,0				;磁头0
	mov 	cl,2				;扇区2
readloop:
	mov 	si,0				;记录失败次数
retry:
	
	mov 	ah,0x02				;ah=0x02:读盘
	mov 	al,1				;1个扇区
	mov 	bx,0
	mov 	dl,0x00				;A驱动器
	int 	0x13				;调用bios
	jnc		next				;没出错,转到下一个扇区
	add 	si,1
	cmp 	si,5				;比较si与5
	jae		error				;si>=5跳转
	mov 	ah,0x00				;为什么要重设一次ah
	mov 	dl,0x00				;A驱动器
	int 	0x13
	jmp		retry
	
next:							;本次主要修改next
	mov 	ax,es				;把内容地址向后移20
	add 	ax,0x0020
	mov 	es,ax				;加法不能用于es
	add 	cl,1
	cmp 	cl,18
	jbe		readloop			;如果小于等于18则跳转
	mov 	cl,1
	add 	dh,1				;dh表示磁头,共有两个磁头
	cmp		dh,2
	jb		readloop
	mov 	dh,0
	add 	ch,1				;ch表示柱面,共要读取10个柱面,cl表示扇区
	cmp		ch,CYLS				;CYLS=10
	jb		readloop
ok:
	mov		[0x0ff0],ch
	jmp		0xc200				;跳转到EMOS.sys所在内存

error:
	mov si,msg
	
putloop:
	mov 	al,[si]
	add		si,1
	cmp 	al,0
	
	je 		fin
	mov 	ah,0x0e				;显示一个文字
	mov 	bx,15				;指定字符颜色
	int 	0x10				;调用显卡BIOS
	
	jmp 	putloop
fin:
	hlt							;等待指令,让cpu进入待机状态
	jmp		fin					;无限循环

msg:
	db 		0x0a,0x0a			;换行两次
	db 		"read error"
	db 		0x0a
	db 		0
	
	resb 	0x7dfe-$
	db 		0x55,0xaa
	
	
	;用于测试读取软盘数据，遇到不能读的数据连续读五次出错就放弃
	;读10个柱面